package middlewares

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"go-0650-blog-grom/controller"
	"go-0650-blog-grom/myUtil/jwt"
)

// JWTAuthMiddleware 基于JWT的认证中间件 (认证 Token )
func JWTAuthMiddleware() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 客户端携带Token有三种方式 1.放在请求头 2.放在请求体 3.放在URI
		// 这里假设Token放在 Header 的 "access_token" 中
		tokenString := c.Request.Header.Get(jwt.ContextTokenKey)
		// tokenString := c.GetHeader(jwt.ContextTokenKey)  // 与上面的语句等价
		if tokenString == "" {
			controller.ResponseErrorWithMsg(c, controller.CodeInvalidToken, "请求头缺少Auth Token")
			c.Abort()
			return
		}

		// 获取到的tokenString, 并使用之前定义好的解析JWT的函数来解析它
		customClaims, err := jwt.ParseToken(tokenString)
		if err != nil {
			fmt.Println(err)
			controller.ResponseError(c, controller.CodeInvalidToken)
			c.Abort()
			return
		}
		// 将当前请求的userID信息保存到请求的上下文c上
		c.Set(controller.ContextUserIDKey, customClaims.UserID)
		c.Next() // 后续的处理函数可以用过c.Get(ContextUserIDKey)来获取当前请求的用户信息
	}
}
